home *** CD-ROM | disk | FTP | other *** search
/ Our Solar System / Our Solar System.iso / shuttle / seesat3 / seesat.h < prev    next >
Text File  |  1990-12-24  |  11KB  |  385 lines

  1. /*
  2. SEESAT.H
  3. by Paul S. Hirose, Edwards AFB, Calif., 1990 Nov 23
  4. Declarations & definitions for globals in the SEESAT satellite tracking
  5. program.
  6.  
  7. This file is in the public domain.
  8. */
  9.  
  10. /* If MAIN is defined, this header will generate definitions.  Otherwise,
  11. only declarations will be generated. */
  12.  
  13. #ifdef MAIN        /* generate DEFINITIONS */
  14. #define CLASS
  15. #define EQUALS(N) = N
  16.  
  17. #else            /* generate DECLARATIONS */
  18. #define CLASS extern
  19. #define EQUALS(N)
  20. #endif
  21.  
  22. /*####################################################################
  23.             MISC DEPENDENCIES
  24. ####################################################################*/
  25.  
  26. #include <stdio.h>
  27.  
  28. /* POW(x, y) raises x to the y power.  Both args are type double. */
  29. #define POW(x, y) pow(x, y)
  30. extern double pow();
  31.  
  32. /* ITOA(s, i) turns int i to a string at the location pointed
  33. to by char pointer s.  The return value from ITOA() is not used.
  34. If you have no itoa(), try:
  35. #define ITOA(s, i) sprintf(s, "%d", i)
  36. int sprintf();     <-- your sprintf() may return a different type
  37. */
  38.  
  39. #define ITOA(s, i) itoa(s, i)
  40. extern char *itoa();
  41.  
  42. /* JMPBUF defines (i.e., allocates space for) an object to be used by
  43. setjmp() and longjmp().  SETJMP() and LONGJMP() must expand to calls to the
  44. actual setjmp() and longjmp().  Here's how they're used in SEESAT:
  45.  
  46. JMPBUF s;    define s as a "jump buffer"
  47. SETJMP(s);    store return location in s
  48. LONGJMP(s, 1);    execute jump to location stored in s, return 1
  49.  
  50. For ANSI C, I suggest the following:
  51.  
  52. #include <setjmp.h>
  53. #define JMPBUF jmp_buf
  54. #define SETJMP(s) setjmp(s)
  55. #define LONGJMP(s, i) longjmp(s, i)
  56. */
  57.  
  58. /* for Ecosoft C */
  59. #define JMPBUF jmp_env
  60. #define SETJMP(s) setjmp(&s)
  61. extern int setjmp();
  62. #define LONGJMP(s, i) longjmp(&s, i)
  63. extern void longjmp();
  64.  
  65. /* Nonzero enables precession correction to R.A./dec.  Zero will eliminate
  66. all precession code. */
  67. #define ENPRE 1
  68.  
  69. /* MALLOC(n) returns a pointer to n bytes of storage, or NULL if insufficient
  70. storage available.  It need not clear the storage it allocates.  In ANSI C:
  71. #define MALLOC(n) malloc(n)
  72. */
  73.  
  74. #define MALLOC(n) alloc(n)
  75.  
  76. /* VOIDP is the type of arg required by free().  In ANSI C, do:
  77. #define VOIDP void *
  78. */
  79.  
  80. #define VOIDP char *
  81.  
  82. /*####################################################################
  83.             Mathematical Constants
  84. ####################################################################*/
  85.  
  86. CLASS double
  87.     pi EQUALS(3.141592653589793),
  88.     e6a EQUALS(1e-6),
  89.     pio2 EQUALS(1.570796326794897),        /* pi/2 */
  90.     tothrd EQUALS(.6666666666666667),    /* 2/3 */
  91.     twopi EQUALS(6.283185307179586),    /* 2pi */
  92.     x3pio2 EQUALS(4.712388980384690),    /* 3pi/2 */
  93.     de2ra EQUALS(.0174532925199433),    /* radians per degree */
  94.     ra2de EQUALS(57.29577951308232);    /* deg per radian */
  95.  
  96. /*####################################################################
  97.             Physical Constants
  98. ####################################################################*/
  99.  
  100. /* dimensions & gravity of earth, World Geodetic System 1972 values */
  101.  
  102. CLASS double
  103. xj2 EQUALS(1.082616e-3),    /* 2nd gravitational zonal harmonic */
  104. xj3,                /* xj3, xj4 initialized at run time */
  105. xj4,
  106. ck2 EQUALS(5.41308E-4),        /* .5 * xj2 */
  107. ck4 EQUALS(6.2098875E-7),    /* -.375 * xj4 */
  108. xke EQUALS(.743669161e-1),    /* = (G*M)^(1/2)*(er/min)^(3/2) where G =
  109.                 Newton's grav const, M = earth mass */
  110.  
  111. xkmper EQUALS(6378.135),    /* equatorial earth radius, km */
  112. mean_r EQUALS(.998882406),    /* mean radius, in units of xkmper */
  113.  
  114. /* SGP4/SGP8 density constants.  qoms2t = ((qo - so) / xkmper) ** 4,
  115. s = 1 + so / xkmper, where qo = 120 and so = 78 */
  116.  
  117. qoms2t EQUALS(1.88027916E-9),
  118. s EQUALS(1.01222928),
  119.  
  120. xmnpda EQUALS(1440.0);        /* time units/day */
  121.  
  122.  
  123. /*####################################################################
  124.             Units & Conventions
  125. ####################################################################*/
  126. /*
  127. Unless the otherwise indicated, throughout this program
  128. quantities are measured in the following units:
  129.  
  130. time interval        minutes
  131. epoch            minutes since 4713 B.C. Jan 1 12h UT Julian
  132.             proleptic calendar
  133. angle            radians
  134. length            equatorial earth radii (1 unit = xkmper km)
  135.  
  136. South latitudes are negative.
  137. East longitude is positive, west negative.
  138. Azimuth is measured starting at north, increasing east.
  139. */
  140.  
  141.  
  142. /*####################################################################
  143.             Structures
  144. ####################################################################*/
  145.  
  146. /* rectangular or spherical coordinates */
  147.  
  148. struct vector { double x, y, z; };
  149.  
  150.  
  151. /* Julian date, time struct.  CAUTION:  jd is the jd at 12h, while time is
  152. measured from 0h, 12h before.  I.e., if s is a jdtim struct, you must
  153. convert to epoch in minutes by doing:  s.jd * 1440. + s.time - 720. */
  154.  
  155. struct jdtim {
  156.     long int jd;    /* Julian date @ 12h */
  157.     double time;    /* minutes since 0h */
  158. };
  159.  
  160. /*####################################################################
  161.                               Global Data
  162. ####################################################################*/
  163.  
  164. CLASS double
  165.     /* satellite's orbital elements. */
  166.     xmo,    /* mean anomaly */
  167.     xnodeo,    /* right ascension of ascending node */
  168.     omegao,    /* argument of the perigee */
  169.     eo,    /* eccentricity */
  170.     xincl,    /* inclination */
  171.     xno,    /* mean motion, radians/min */
  172.     xndt2o,    /* 1st time derivative of mean motion, or ballistic
  173.         coefficient (depending on ephemeris type) */
  174.     xndd6o, /* 2nd time derivative of mean motion */
  175.     bstar,    /* BSTAR drag term if GP4 theory was used;
  176.         otherwise, radiation pressure coefficient */
  177.     epoch,    /* epoch of elements */
  178.  
  179.  
  180.     ds50,    /* days since 1950 */
  181.     zd,    /* UTC - local time */
  182.     toffs;    /* value of OFFSET command */
  183.  
  184. /* Satellite geocentric position and velocity.  Generated by the
  185. prediction model. */
  186. CLASS struct vector sat, satdot;
  187.  
  188. /* The following data come from xyztop() */
  189. CLASS struct vector
  190.     azel,        /* azimuth, elevation, slant range */
  191.     radec,        /* Right Ascension, declination, slant range */
  192.     latlon;        /* longitude, latitude, altitude */
  193. CLASS int elsusa;    /* elev of sun above sat's horizon, degrees */
  194.  
  195. CLASS JMPBUF reset;    /* used by LONGJMP() to return control
  196.             to user in case of erroneous command */
  197.  
  198. CLASS int iflag;    /* = 1 with new orbital elements,
  199.             reset to 0 by prediction model on first call */
  200.  
  201. CLASS char **tokp;    /* pointer to command line tokens */
  202.  
  203. CLASS char name[23];    /* of satellite */
  204.  
  205. /*######################### Functions #########################*/
  206.  
  207. /*========================== ASTRO.C =========================*/
  208.  
  209. extern void dusk();    /* no args
  210.     prints azimuth & elevation of sun at observer. */
  211.  
  212. extern double fmod2p();        /* (x)
  213. double x;
  214.     Returns x modulo 2pi */
  215.  
  216. extern void inpre();    /* no args
  217.     initializes the precession rotation matrix */
  218.  
  219. extern void moon();    /* no args
  220.     prints az, el, % of illum of moon */
  221.  
  222. extern void parall();    /* no args
  223.     prints the parallactic angle at the sat */
  224.  
  225. extern void setep();    /* no args
  226.     sets new terminal epoch for precession */
  227.  
  228. extern double thetag();    /* (t)
  229. double t;    epoch
  230.     Returns Greenwich hour angle of Aries at t & sets ds50 */
  231.  
  232. extern double topos();    /* no args
  233.     gets observer's location.  Returns time zone offset */
  234.  
  235. extern int xyztop();    /* (t)
  236. double t;    epoch
  237.     computes topocentric coordinates of sat, return 1 if data should be
  238.     printed. */
  239.  
  240. /*========================= READEL.C =========================*/
  241.  
  242. extern void hfree();    /* no args
  243.     frees all heap storage */
  244. extern void index();    /* no args
  245.     lists satellites in the open element file */
  246. extern void load();    /* no args
  247.     Loads orbital elements from the open element file */
  248. extern void opn();    /* no args
  249.     opens element file */
  250.  
  251. /*========================== SGP4.C ==========================*/
  252.  
  253. extern void sgp4();    /* (tsince)
  254. double tsince;        elapsed time since epoch of elements
  255.     generates geocentric (x, y, z) of satellite */
  256.  
  257. /*========================== UTIL.C ==========================*/
  258.  
  259. extern double atomin();        /* (string)
  260. char *string;
  261.     convert string to minutes */
  262.  
  263. extern char **degdms();        /* (pre, x)
  264. int pre;    desired precision
  265. double x;    degrees
  266.     convert x to deg, minutes, seconds strings */
  267.  
  268. extern double din();    /* (str)
  269. char *str;
  270.     input a double from console, str is default value */
  271.  
  272. extern char *jdstr();    /* (jd)
  273. long int jd;
  274.     converts jd to year, month, day in string form */
  275.  
  276. extern long int julday();    /* (y, m, d)
  277. int y, m, d;
  278.     returns JD (unit = days) of given year, month, day @ 12h */
  279.  
  280. extern char *stoup();    /* (str)
  281. char *str;
  282.     converts str to all upper case, returns str */
  283.  
  284. extern char *timstr();    /* (m)
  285. double m;    minutes
  286.     converts m to string of "hhmm:ss" format */
  287.  
  288. extern void tok();    /* no args
  289.     gets new command line if current one exhausted */
  290.  
  291. extern void tokjum();    /* (t)
  292. struct jdtim *t;    destination of result
  293.     converts date/time group on command line to JD & minutes */
  294.  
  295. extern double tokmin();        /* no args
  296.     converts date/time group on cmd line to epoch in minutes */
  297.  
  298. /*#################### DEBUGGING FUNCTIONS ####################*/
  299.  
  300. /* DEBUG is controlled in the file that #includes this file. */
  301.  
  302. #ifdef DEBUG
  303. #define DTEST(a) ddebug a
  304. #define ETEST(a) edebug a
  305. #define FTEST(a) fdebug a
  306. extern void ddebug(), edebug(), fdebug();
  307.  
  308. #ifdef MAIN
  309.  
  310. /* Debugging functions.  This stuff is only activated when
  311. SEESAT.C is compiled with DEBUG on.  Each function printf()s a
  312. variable number of arguments of a particular type.  If the bp
  313. argument passed to the function matches variable stopat, the
  314. arguments are printf() all on the same line.  If bp != stopat, no
  315. action occurs.  The arguments to be printed are passed by
  316. reference, and the number of arguments is given by argc. */
  317.  
  318. static int stopat;        /* currently active break point */
  319.  
  320. void
  321. ddebug(bp, argc, arg1)
  322. int bp, argc, *arg1;
  323. {
  324.     if (bp == stopat) {
  325.         int **argptr;
  326.         printf("%d: ", bp);
  327.         for (argptr = &arg1; argc ; ++argptr, --argc)
  328.             printf("%d ", **argptr);
  329.         getbp();
  330. }    }
  331.  
  332. void
  333. edebug(bp, argc, prec, arg1)
  334. int bp, argc, prec;
  335. double *arg1;
  336. {
  337.     if (bp == stopat) {
  338.         double **argptr;
  339.         printf("%d: ", bp);
  340.         for (argptr = &arg1; argc; ++argptr, --argc)
  341.             printf("%.*e ", prec, **argptr);
  342.         getbp();
  343. }    }
  344.  
  345. void
  346. fdebug(bp, argc, prec, arg1)
  347. int bp, argc, prec;
  348. double *arg1;
  349. {
  350.     if (bp == stopat) {
  351.         double **argptr;
  352.         printf("%d: ", bp);
  353.         for (argptr = &arg1; argc; ++argptr, --argc)
  354.             printf("%.*f ", prec, **argptr);
  355.         getbp();
  356. }    }
  357.  
  358. static void
  359. getbp()
  360.  
  361. /* ask for next breakpoint, put value in stopat */
  362. {
  363.     char buffer[7];
  364.     printf("\nnext breakpoint? ");
  365.     stopat = atoi(gets(buffer));
  366. }
  367.  
  368. #endif
  369.  
  370. #else
  371. /* Debugging is turned off, so expand the macros to nothing */
  372. #define DTEST(a)
  373. #define ETEST(a)
  374. #define FTEST(a)
  375.  
  376. #endif
  377. int */
  378.  
  379. void
  380. ddebug(bp, argc, arg1)
  381. int bp, argc, *arg1;
  382. {
  383.     if (bp == stopat) {
  384.         int **argptr;
  385.         printf("%d: